package com.gxa.hualian.web.servlet;

import com.aliyuncs.CommonRequest;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;

import com.gxa.hualian.entity.Manager;
import com.gxa.hualian.entity.User;
import com.gxa.hualian.exception.BusinessException;
import com.gxa.hualian.exception.ExceptionCode;

import com.gxa.hualian.service.ManagerService;
import com.gxa.hualian.service.UserService;
import com.gxa.hualian.service.impl.ManagerServiceImpl;
import com.gxa.hualian.service.impl.UserServiceImpl;
import com.gxa.hualian.util.JsonResult;
import com.gxa.hualian.util.ResponseUtil;
import com.gxa.hualian.util.StringUtil;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

import java.util.Random;

@WebServlet(name = "SmsServlet", value = "/sms")
public class SmsServlet extends HttpServlet {
   private UserService userService= new UserServiceImpl();
   private ManagerService managerService=new ManagerServiceImpl();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取要被发送验证码的手机号
        System.out.println("SmsServlet有请求进来了");
        String phone=req.getParameter("phone");
        System.out.println(phone);
        // 创建ServletContext
        ServletContext servletContext = req.getServletContext();

        String encoding = servletContext.getInitParameter("encoding");

        // 接收前端的请求参数时,如果有中文, 也采用UTF-8编码格式来处理
        req.setCharacterEncoding(encoding);
        //获取请求路径

        String handlerType=req.getHeader("handlerType");

        // 支持中文
        resp.setCharacterEncoding(encoding);
        resp.setContentType("application/json;charset="+encoding);

        //前端不管是否进行过校验,后端都要再校验异常
        //数据校验(保证前端的数据是可用的)
        Boolean empty = StringUtil.isEmpty(phone);

        try {
            User user = userService.selectByPhone(phone);
           Manager manager=managerService.selectByPhone(phone);
        } catch (Exception e) {
            //当有异常发生,当前Servlet不做处理,统一转发给ExceptionServlet
            //利用request作用域对象,将e传递
            req.setAttribute("exception",e);
            //实现转发
            this.getServletContext().getRequestDispatcher("/error").forward(req,resp);
        }
        if (!empty){
            //调用第三方接口(阿里短信)完成
            // 填写发送方的accessKey id 和 密钥
            DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI5tGSEWzS9RM8EjC2w8bK", "IaTDtee5wde5RLvl3qIEXBZxbcMPOm");
            IAcsClient client = new DefaultAcsClient(profile);



           //和阿里短信服务器的发送与接收,使用的是远程连接
            //HttpClient 是一个封装了远程连接和资源访问的工具类

            // 配置发送参数
            CommonRequest request = new CommonRequest();

            // 标准的服务器参数, 不能改
            request.setSysMethod(MethodType.POST);
            request.setSysDomain("dysmsapi.aliyuncs.com");
            request.setSysVersion("2017-05-25");
            request.setSysAction("SendSms");
            request.putQueryParameter("RegionId", "cn-hangzhou");
            // 填写接收短信的手机号
            request.putQueryParameter("PhoneNumbers", phone);
            //填写审核通过的签名
            request.putQueryParameter("SignName", "小溪商城");
            //填写审核通过的短信模板code
            request.putQueryParameter("TemplateCode", "SMS_204986028");

            // 生成4位随机数(1-9之间)
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i <4 ; i++) {
                builder.append(new Random().nextInt(8)+1);
            }
            //把验证码存储在Session作用域
            //获取Session对象
            //空参表示直接生成,保证了一定有Session
            HttpSession session=req.getSession();
            //带bolean参数,存在一个判读机制
            //ture表示当前Servlet已经存在Session,就获得改Session
            //false表示如果没有,就返回null

            //把验证码存储在session作用域
            session.setAttribute("captcha",builder.toString());


            // 作弊方式获取session存的验证码
            System.out.println("captcha:"+builder.toString());
// 给阿里云短信模板中的${code}赋值，json格式
//            request.putQueryParameter("TemplateParam", "{'code':"+builder.toString()+"}");
//               try {
//                    // 执行发送操作
//                    CommonResponse response = client.getCommonResponse(request);
//                    // 获取 阿里短信接口给当前的发送请求响应的数据
//                    String data = response.getData();
//                    //{"Message":"OK","RequestId":"CBC83055-A113-483A-91B2-0E4C56CCC643","BizId":"790710603115763709^0","Code":"OK"}
//
//                    ObjectMapper mapper = new ObjectMapper();
//                    Map<String, Object> tmpMap=mapper.readValue(data, Map.class);
//                    // Code 为OK表示发送成功
//                    if("OK".equals(tmpMap.get("Code"))){
//                        // 给前端返回消息, 发送成功
//                        JsonResult jsonResult = new JsonResult();
//                        jsonResult.setCode("1");
//                        ResponseUtil responseUtil=new ResponseUtil(resp,jsonResult);
//                        responseUtil.write();
//                    }else{
//                        // 传给统一异常处理器集中处理
//                        req.setAttribute("exception",new BusinessException(ExceptionCode.SEND_SMS_FAILED));
//
//                        // 转发给异常处理器
//                        this.getServletContext().getRequestDispatcher("/error").forward(req,resp);
//                    }
//
//                } catch (Exception e) {
//                   e.printStackTrace();
//                    // 传给统一异常处理器集中处理
//                    req.setAttribute("exception",new BusinessException(ExceptionCode.WRONG_PHONE_NUMBER));
//
//                    // 转发给异常处理器
//                    this.getServletContext().getRequestDispatcher("/error").forward(req,resp);
//                }
            //3. 向Map中添加数据
            JsonResult jsonResult = new JsonResult();
            ResponseUtil responseUtil=null;
            jsonResult.setCode("1");
            //2. 声明ResponseUtil对象,完成写操作
            responseUtil = new ResponseUtil(resp,jsonResult);
            responseUtil.write();
        }else{
            // 当手机号不符合规则, 创建一个自定义异常(手机号格式不正确)
            // 传给统一异常处理器集中处理
            req.setAttribute("exception",new BusinessException(ExceptionCode.WRONG_PHONE_NUMBER));

            // 转发给异常处理器
            this.getServletContext().getRequestDispatcher("/error").forward(req,resp);
        }




    }
}
